{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Python to C++ Code Translator using LLMs\n",
    "\n",
    "This notebook translates Python code to compilable C++ using GPT, Gemini, or Claude.\n",
    "\n",
    "## Features:\n",
    "- 🤖 Multiple LLM support (GPT, Gemini, Claude)\n",
    "- ✅ Automatic compilation testing with g++\n",
    "- 🔄 Comparison mode to test all LLMs\n",
    "- 💬 Interactive translation mode"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 1: Install Required Packages\n",
    "\n",
    "Run this cell first to install all dependencies:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "!uv add openai anthropic python-dotenv google-generativeai\n",
    "#!pip install openai anthropic python-dotenv google-generativeai"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 2: Import Libraries"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import subprocess\n",
    "import tempfile\n",
    "from pathlib import Path\n",
    "from dotenv import load_dotenv\n",
    "import openai\n",
    "from anthropic import Anthropic\n",
    "import google.generativeai as genai"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 3: Load API Keys\n",
    "\n",
    "Make sure you have a `.env` file with:\n",
    "```\n",
    "OPENAI_API_KEY=your_key_here\n",
    "GEMINI_API_KEY=your_key_here\n",
    "ANTHROPIC_API_KEY=your_key_here\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Load API keys from .env file\n",
    "load_dotenv()\n",
    "\n",
    "# Initialize API clients\n",
    "openai_client = openai.OpenAI(api_key=os.getenv('OPENAI_API_KEY'))\n",
    "anthropic_client = Anthropic(api_key=os.getenv('ANTHROPIC_API_KEY'))\n",
    "genai.configure(api_key=os.getenv('GEMINI_API_KEY'))\n",
    "\n",
    "print(\"✓ API keys loaded successfully\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 4: Define System Prompt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "SYSTEM_PROMPT = \"\"\"You are an expert programmer that translates Python code to C++.\n",
    "Translate the given Python code to efficient, compilable C++ code.\n",
    "\n",
    "Requirements:\n",
    "- The C++ code must compile without errors\n",
    "- Include all necessary headers\n",
    "- Use modern C++ (C++11 or later) features where appropriate\n",
    "- Add proper error handling\n",
    "- Maintain the same functionality as the Python code\n",
    "- Include a main() function if the Python code has executable statements\n",
    "\n",
    "Only return the C++ code, no explanations unless there are important notes about compilation.\"\"\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 5: LLM Translation Functions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def translate_with_gpt(python_code, model=\"gpt-4o\"):\n",
    "    \"\"\"Translate Python to C++ using OpenAI's GPT models\"\"\"\n",
    "    try:\n",
    "        response = openai_client.chat.completions.create(\n",
    "            model=model,\n",
    "            messages=[\n",
    "                {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n",
    "                {\"role\": \"user\", \"content\": f\"Translate this Python code to C++:\\n\\n{python_code}\"}\n",
    "            ],\n",
    "            temperature=0.2\n",
    "        )\n",
    "        return response.choices[0].message.content\n",
    "    except Exception as e:\n",
    "        return f\"Error with GPT: {str(e)}\"\n",
    "\n",
    "def translate_with_gemini(python_code, model=\"gemini-2.0-flash-exp\"):\n",
    "    \"\"\"Translate Python to C++ using Google's Gemini\"\"\"\n",
    "    try:\n",
    "        model_instance = genai.GenerativeModel(model)\n",
    "        prompt = f\"{SYSTEM_PROMPT}\\n\\nTranslate this Python code to C++:\\n\\n{python_code}\"\n",
    "        response = model_instance.generate_content(prompt)\n",
    "        return response.text\n",
    "    except Exception as e:\n",
    "        return f\"Error with Gemini: {str(e)}\"\n",
    "\n",
    "def translate_with_claude(python_code, model=\"claude-sonnet-4-20250514\"):\n",
    "    \"\"\"Translate Python to C++ using Anthropic's Claude\"\"\"\n",
    "    try:\n",
    "        response = anthropic_client.messages.create(\n",
    "            model=model,\n",
    "            max_tokens=4096,\n",
    "            temperature=0.2,\n",
    "            system=SYSTEM_PROMPT,\n",
    "            messages=[\n",
    "                {\"role\": \"user\", \"content\": f\"Translate this Python code to C++:\\n\\n{python_code}\"}\n",
    "            ]\n",
    "        )\n",
    "        return response.content[0].text\n",
    "    except Exception as e:\n",
    "        return f\"Error with Claude: {str(e)}\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 6: Main Translation Function"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def translate_python_to_cpp(python_code, llm=\"gpt\", model=None):\n",
    "    \"\"\"\n",
    "    Translate Python code to C++ using specified LLM\n",
    "    \n",
    "    Args:\n",
    "        python_code (str): Python code to translate\n",
    "        llm (str): LLM to use ('gpt', 'gemini', or 'claude')\n",
    "        model (str): Specific model version (optional)\n",
    "    \n",
    "    Returns:\n",
    "        str: Translated C++ code\n",
    "    \"\"\"\n",
    "    print(f\"🔄 Translating with {llm.upper()}...\")\n",
    "    \n",
    "    if llm.lower() == \"gpt\":\n",
    "        model = model or \"gpt-4o\"\n",
    "        cpp_code = translate_with_gpt(python_code, model)\n",
    "    elif llm.lower() == \"gemini\":\n",
    "        model = model or \"gemini-2.0-flash-exp\"\n",
    "        cpp_code = translate_with_gemini(python_code, model)\n",
    "    elif llm.lower() == \"claude\":\n",
    "        model = model or \"claude-sonnet-4-20250514\"\n",
    "        cpp_code = translate_with_claude(python_code, model)\n",
    "    else:\n",
    "        return \"Error: Invalid LLM. Choose 'gpt', 'gemini', or 'claude'\"\n",
    "    \n",
    "    return cpp_code"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 7: Compilation Testing Functions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def extract_cpp_code(text):\n",
    "    \"\"\"Extract C++ code from markdown code blocks if present\"\"\"\n",
    "    if \"```cpp\" in text:\n",
    "        start = text.find(\"```cpp\") + 6\n",
    "        end = text.find(\"```\", start)\n",
    "        return text[start:end].strip()\n",
    "    elif \"```c++\" in text:\n",
    "        start = text.find(\"```c++\") + 6\n",
    "        end = text.find(\"```\", start)\n",
    "        return text[start:end].strip()\n",
    "    elif \"```\" in text:\n",
    "        start = text.find(\"```\") + 3\n",
    "        end = text.find(\"```\", start)\n",
    "        return text[start:end].strip()\n",
    "    return text.strip()\n",
    "\n",
    "def compile_cpp_code(cpp_code, output_name=\"translated_program\"):\n",
    "    \"\"\"\n",
    "    Compile C++ code and return compilation status\n",
    "    \n",
    "    Args:\n",
    "        cpp_code (str): C++ code to compile\n",
    "        output_name (str): Name of output executable\n",
    "    \n",
    "    Returns:\n",
    "        dict: Compilation result with status and messages\n",
    "    \"\"\"\n",
    "    # Extract code from markdown if present\n",
    "    cpp_code = extract_cpp_code(cpp_code)\n",
    "    \n",
    "    # Create temporary directory\n",
    "    with tempfile.TemporaryDirectory() as tmpdir:\n",
    "        cpp_file = Path(tmpdir) / \"program.cpp\"\n",
    "        exe_file = Path(tmpdir) / output_name\n",
    "        \n",
    "        # Write C++ code to file\n",
    "        with open(cpp_file, 'w') as f:\n",
    "            f.write(cpp_code)\n",
    "        \n",
    "        # Try to compile\n",
    "        try:\n",
    "            result = subprocess.run(\n",
    "                ['g++', '-std=c++17', str(cpp_file), '-o', str(exe_file)],\n",
    "                capture_output=True,\n",
    "                text=True,\n",
    "                timeout=10\n",
    "            )\n",
    "            \n",
    "            if result.returncode == 0:\n",
    "                return {\n",
    "                    'success': True,\n",
    "                    'message': '✓ Compilation successful!',\n",
    "                    'executable': str(exe_file),\n",
    "                    'stdout': result.stdout,\n",
    "                    'stderr': result.stderr\n",
    "                }\n",
    "            else:\n",
    "                return {\n",
    "                    'success': False,\n",
    "                    'message': '✗ Compilation failed',\n",
    "                    'stdout': result.stdout,\n",
    "                    'stderr': result.stderr\n",
    "                }\n",
    "        except subprocess.TimeoutExpired:\n",
    "            return {\n",
    "                'success': False,\n",
    "                'message': '✗ Compilation timed out'\n",
    "            }\n",
    "        except FileNotFoundError:\n",
    "            return {\n",
    "                'success': False,\n",
    "                'message': '✗ g++ compiler not found. Please install g++ to compile C++ code.'\n",
    "            }\n",
    "        except Exception as e:\n",
    "            return {\n",
    "                'success': False,\n",
    "                'message': f'✗ Compilation error: {str(e)}'\n",
    "            }"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 8: Complete Pipeline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def translate_and_compile(python_code, llm=\"gpt\", model=None, verbose=True):\n",
    "    \"\"\"\n",
    "    Translate Python to C++ and attempt compilation\n",
    "    \n",
    "    Args:\n",
    "        python_code (str): Python code to translate\n",
    "        llm (str): LLM to use\n",
    "        model (str): Specific model version\n",
    "        verbose (bool): Print detailed output\n",
    "    \n",
    "    Returns:\n",
    "        dict: Results including translated code and compilation status\n",
    "    \"\"\"\n",
    "    # Translate\n",
    "    cpp_code = translate_python_to_cpp(python_code, llm, model)\n",
    "    \n",
    "    if verbose:\n",
    "        print(\"\\n\" + \"=\"*60)\n",
    "        print(\"TRANSLATED C++ CODE:\")\n",
    "        print(\"=\"*60)\n",
    "        print(cpp_code)\n",
    "        print(\"=\"*60 + \"\\n\")\n",
    "    \n",
    "    # Compile\n",
    "    print(\"🔨 Attempting to compile...\")\n",
    "    compilation_result = compile_cpp_code(cpp_code)\n",
    "    \n",
    "    if verbose:\n",
    "        print(compilation_result['message'])\n",
    "        if not compilation_result['success'] and 'stderr' in compilation_result:\n",
    "            print(\"\\nCompilation errors:\")\n",
    "            print(compilation_result['stderr'])\n",
    "    \n",
    "    return {\n",
    "        'cpp_code': cpp_code,\n",
    "        'compilation': compilation_result\n",
    "    }"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Example 1: Factorial Function"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "python_code_1 = \"\"\"\n",
    "def factorial(n):\n",
    "    if n <= 1:\n",
    "        return 1\n",
    "    return n * factorial(n - 1)\n",
    "\n",
    "# Test the function\n",
    "print(factorial(5))\n",
    "\"\"\"\n",
    "\n",
    "print(\"Example 1: Factorial Function\")\n",
    "print(\"=\"*60)\n",
    "result1 = translate_and_compile(python_code_1, llm=\"gpt\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Example 2: Sum of Squares"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "python_code_2 = \"\"\"\n",
    "def sum_of_squares(numbers):\n",
    "    return sum(x**2 for x in numbers)\n",
    "\n",
    "numbers = [1, 2, 3, 4, 5]\n",
    "result = sum_of_squares(numbers)\n",
    "print(f\"Sum of squares: {result}\")\n",
    "\"\"\"\n",
    "\n",
    "print(\"Example 2: Sum of Squares\")\n",
    "print(\"=\"*60)\n",
    "result2 = translate_and_compile(python_code_2, llm=\"claude\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Example 3: Fibonacci with Gemini"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "python_code_3 = \"\"\"\n",
    "def fibonacci(n):\n",
    "    if n <= 1:\n",
    "        return n\n",
    "    a, b = 0, 1\n",
    "    for _ in range(2, n + 1):\n",
    "        a, b = b, a + b\n",
    "    return b\n",
    "\n",
    "print(f\"Fibonacci(10) = {fibonacci(10)}\")\n",
    "\"\"\"\n",
    "\n",
    "print(\"Example 3: Fibonacci with Gemini\")\n",
    "print(\"=\"*60)\n",
    "result3 = translate_and_compile(python_code_3, llm=\"gemini\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Compare All LLMs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def compare_llms(python_code):\n",
    "    \"\"\"Compare all three LLMs on the same Python code\"\"\"\n",
    "    llms = [\"gpt\", \"gemini\", \"claude\"]\n",
    "    results = {}\n",
    "    \n",
    "    for llm in llms:\n",
    "        print(f\"\\n{'='*60}\")\n",
    "        print(f\"Testing with {llm.upper()}\")\n",
    "        print('='*60)\n",
    "        results[llm] = translate_and_compile(python_code, llm=llm, verbose=False)\n",
    "        print(results[llm]['compilation']['message'])\n",
    "    \n",
    "    return results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Test code for comparison\n",
    "python_code_compare = \"\"\"\n",
    "def is_prime(n):\n",
    "    if n < 2:\n",
    "        return False\n",
    "    for i in range(2, int(n**0.5) + 1):\n",
    "        if n % i == 0:\n",
    "            return False\n",
    "    return True\n",
    "\n",
    "primes = [x for x in range(2, 20) if is_prime(x)]\n",
    "print(f\"Primes under 20: {primes}\")\n",
    "\"\"\"\n",
    "\n",
    "print(\"COMPARING ALL LLMs\")\n",
    "print(\"=\"*60)\n",
    "comparison_results = compare_llms(python_code_compare)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Interactive Translation Mode\n",
    "\n",
    "Use this cell to translate your own Python code interactively:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Your custom Python code here\n",
    "your_python_code = \"\"\"\n",
    "# Paste your Python code here\n",
    "def hello_world():\n",
    "    print(\"Hello, World!\")\n",
    "\n",
    "hello_world()\n",
    "\"\"\"\n",
    "\n",
    "# Choose your LLM: \"gpt\", \"gemini\", or \"claude\"\n",
    "chosen_llm = \"gpt\"\n",
    "\n",
    "result = translate_and_compile(your_python_code, llm=chosen_llm)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Summary\n",
    "\n",
    "You now have a complete Python to C++ translator! \n",
    "\n",
    "### Main Functions:\n",
    "- `translate_python_to_cpp(code, llm, model)` - Translate only\n",
    "- `translate_and_compile(code, llm, model)` - Translate and compile\n",
    "- `compare_llms(code)` - Compare all three LLMs\n",
    "\n",
    "### Supported LLMs:\n",
    "- **gpt** - OpenAI GPT-4o\n",
    "- **gemini** - Google Gemini 2.0 Flash\n",
    "- **claude** - Anthropic Claude Sonnet 4\n",
    "\n",
    "Happy translating! 🚀"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": ".venv",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
